package saa.dao.periodo.aluno;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import saa.dominio.periodo.OfertaDisciplina;
import saa.dominio.periodo.UnidadeDisciplina;
import saa.dominio.periodo.aluno.OfertaDisciplinaAluno;
import saa.dominio.periodo.aluno.UnidadeDisciplinaAluno;
import saa.dominio.usuario.Aluno;

@Stateless
public class OfertaDisciplinaAlunoDAO implements OfertaDisciplinaAlunoDAOInterface {

    @PersistenceContext(unitName = "SAAPU")
    private EntityManager em;

    @Override
    public List<OfertaDisciplinaAluno> listar() {
        return em
                .createNamedQuery("OfertaDisciplinaAlunos", OfertaDisciplinaAluno.class)
                .getResultList();
    }

    @Override
    public List<OfertaDisciplinaAluno> listar(long idAluno) {
        return em
                .createNamedQuery("OfertaDisciplinaAluno.aluno.id", OfertaDisciplinaAluno.class)
                .setParameter("id", idAluno)
                .getResultList();
    }

    @Override
    public OfertaDisciplinaAluno buscar(long alunoId, long ofertaId) {
        try {
            return em
                    .createNamedQuery("OfertaDisciplinaAluno.aluno.id,OfertaDisciplinaAluno.ofertaDisciplina.id", OfertaDisciplinaAluno.class)
                    .setParameter("alunoId", alunoId)
                    .setParameter("ofertaId", ofertaId)
                    .getSingleResult();
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public boolean criar(Aluno aluno, OfertaDisciplina ofertaDisciplina) {
        try {
            if (buscar(aluno.getId(), ofertaDisciplina.getId()) == null) {
                aluno = em
                        .createNamedQuery("Aluno.id", Aluno.class)
                        .setParameter("id", aluno.getId())
                        .getSingleResult();
                ofertaDisciplina = em
                        .createNamedQuery("OfertaDisciplina.id", OfertaDisciplina.class)
                        .setParameter("id", ofertaDisciplina.getId())
                        .getSingleResult();
                
                
                OfertaDisciplinaAluno ofertaDisciplinaAluno = new OfertaDisciplinaAluno(ofertaDisciplina, aluno);
                em.persist(ofertaDisciplinaAluno);
                aluno.addDisciplina(ofertaDisciplinaAluno);

                for (UnidadeDisciplina unidade : ofertaDisciplina.getUnidades()) {
                    UnidadeDisciplinaAluno unidadeAluno = new UnidadeDisciplinaAluno(ofertaDisciplinaAluno, unidade, 0, 0, ofertaDisciplinaAluno.getObjetivoNota(), ofertaDisciplinaAluno.getObjetivoPresencas() / 2);
                    em.persist(unidadeAluno);
                    ofertaDisciplinaAluno.addBimestre(unidadeAluno);
                    em.merge(ofertaDisciplinaAluno);
                }
                em.merge(aluno);
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }
}
